package com.songtech.uitest.util;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;

/**
 * 为了实现测试方法失败后的重试，特写此类
 */
public class Retry implements IRetryAnalyzer{

    private Logger logger = LoggerFactory.getLogger(Retry.class);

    private int initReTryNum = 1;

    private int maxReTryNum = 5;


    @Override
    public boolean retry(ITestResult iTestResult){
        //如果是断言引起的异常(那一定是致命异常)，则不要重试了，交由Assertion.java去处理
        if(Assertion.fatal){return false;}

        if(initReTryNum <= maxReTryNum){
            String clsName = StringUtils.substringAfterLast(iTestResult.getTestClass().getName(), ".");

            String message="执行" + clsName + "类" + iTestResult.getName()+ "方法的流程失败，异常信息为：" + iTestResult.getThrowable();
            iTestResult.getThrowable().printStackTrace();
            logger.error(message);
            logger.info("尝试第" + initReTryNum + "次重试");

            //记录到汇总类
            SumUpHelper sumUpHelper = (SumUpHelper) SpringUtil.getBean("sumUpHelper");
//            sumUpHelper.getFlowErrorList().add(message);
            sumUpHelper.getRetryList().add(message);

//            Reporter.setCurrentTestResult(iTestResult);
//            Reporter.log(message);
            try {
                //由于此Retry方法是在spring容器加载前生成的，注入的rollbackHelper在那时都为null，起不了作用
//                rollbackHelper.rollbackCurrentDriverToInit();
                //改为这样即可：
                RollbackHelper rollbackHelper = (RollbackHelper) SpringUtil.getBean("rollbackHelper");
                rollbackHelper.rollbackCurrentDriverToInit();

//                ScreenShoter screenShoter = (ScreenShoter) SpringUtil.getBean("screenShoter");
//                screenShoter.screenShot(new Object[]{clsName, iTestResult.getName(), "流程重试"});

            }catch (Exception e){
                e.printStackTrace();
            }

            initReTryNum++;
            return true;
        }

        //由于spring注入时机的问题，rollbackHelper会为空，无法起作用。
        //重试次数用完，则不会再回滚，回滚帮助对象的计数器归0。
        //这里的重试归零是针对testng的单个@test测试方法而言的，一个测试方法重试次数完了，到下一个测试方法时，帮助对象的计数器要归0
//        rollbackHelper.setCounter(0);
        //改为这样就OK了：
        RollbackHelper rollbackHelper = (RollbackHelper) SpringUtil.getBean("rollbackHelper");
        rollbackHelper.setCounter(0);
        return false;
    }
}
